package com.version1.diabeco.ui.medicacion;


import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


import kankan.wheel.widget.OnWheelChangedListener;
import kankan.wheel.widget.WheelView;
import kankan.wheel.widget.adapters.NumericWheelAdapter;
import kankan.wheel.widget.adapters.WheelViewAdapter;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.version1.diabeco.ActivityMain;
import com.version1.diabeco.DateArrayAdapter;
import com.version1.diabeco.DateNumericAdapter;
import com.version1.diabeco.R;
import com.version1.diabeco.data.ajustes.medicamentos.MedicamentoDaoImpl;
import com.version1.diabeco.data.ajustes.perfilusuario.PerfilUsuarioDaoImpl;
import com.version1.diabeco.data.medicacion.MedicacionDaoImpl;
import com.version1.diabeco.model.ajustes.medicamento.Medicamento;
import com.version1.diabeco.model.ajustes.perfilusuario.PerfilUsuario;
import com.version1.diabeco.model.medicacion.Medicacion;

//TODO Puedes utilizar spinner.setSelection(X) en el onCreate para cuando 
//entres a la activity se te seleccione el de la posicion X por defecto.
public class ActivityRegistroMedicacion extends Activity {

	Intent intentMedicamentoNueva;
	int intCreando = 1;
	private PerfilUsuario objPerfilUsuario;
	
	// Elementos de la Pantalla
	Spinner spinnerMedicamentos, spinnerDosis, spinnerAplicacion;
	Button btnFecha, btnHora;
	Calendar objCalendario;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_registro_medicacion);

		//Cargamos el Perfil de Usuario de la Base de Datos
		objPerfilUsuario = PerfilUsuarioDaoImpl.getInstance(this).selectUsuarioActivo();
		
		// Obtenemos la referencia a los campos de la pantalla
		spinnerMedicamentos = (Spinner) findViewById(R.id.spinnerMedicamentos);
		spinnerDosis = (Spinner) findViewById(R.id.spinnerDosis);
		spinnerAplicacion = (Spinner) findViewById(R.id.spinnerAplicacion);
		btnFecha = (Button) findViewById(R.id.btnFecha);
		btnHora = (Button) findViewById(R.id.btnHora);
		objCalendario = Calendar.getInstance();

		spinnerMedicamentos.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view, int posicion, long id) {
				TextView lblSpinnerAplicacion = (TextView) findViewById(R.id.textViewAplicacion);
				Spinner spinnerAplicacion = (Spinner) findViewById(R.id.spinnerAplicacion);

				if (esInsulina(spinnerMedicamentos) == true) {
					lblSpinnerAplicacion.setVisibility(View.VISIBLE);
					spinnerAplicacion.setEnabled(true);
					spinnerAplicacion.setVisibility(View.VISIBLE);
				} else {
					lblSpinnerAplicacion.setVisibility(View.INVISIBLE);
					spinnerAplicacion.setEnabled(false);
					spinnerAplicacion.setVisibility(View.INVISIBLE);
				}
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub
			}

		});

		// Cargamos los medicamentos de la DB en el Spinner
		cargarSpinnerMedicamentos();

		// Obtenemos el Intent
		intentMedicamentoNueva = getIntent();

		Medicacion medicacion = (Medicacion) intentMedicamentoNueva
				.getSerializableExtra(ActivityListaRegistrosMedicacion.INTENT_VALUE_MEDICACION);

		if (medicacion.getId() != null) {
			// Cargamos los Spiner de Dosis y Aplicacion
			posicionarSpinner(medicacion.getDosis(), spinnerDosis);
			posicionarSpinner(medicacion.getLugarAplicacion(), spinnerAplicacion);
			posicionarSpinnerMedicamento(spinnerMedicamentos, medicacion.getMedicamento().getId());
		}
		// Cargamos la fecha y la Hora
		cargarBtnFecha(medicacion.getFecha());
		cargarBtnHora(medicacion.getFecha());

	}

//	@Override
//	public boolean onCreateOptionsMenu(Menu menu) {
//		// Inflate the menu; this adds items to the action bar if it is present.
//		getMenuInflater().inflate(R.menu.activity_medicamento_nueva, menu);
//		return true;
//	}

	void posicionarSpinner(String texto, Spinner combo) {

		if (texto != null) {
			ArrayAdapter myAdap = (ArrayAdapter) combo.getAdapter();
			int spinnerPosition = myAdap.getPosition(texto);
			combo.setSelection(spinnerPosition);
		}
	}

	void cargarSpinnerMedicamentos() {
		List<Medicamento> medicamentos = MedicamentoDaoImpl.getInstance(this).selectAll();
		MedicamentoSpinnerAdapter adapter = new MedicamentoSpinnerAdapter(this, medicamentos);
		spinnerMedicamentos.setAdapter(adapter);
	}

	private void posicionarSpinnerMedicamento(Spinner combo, Long idMedicamento) {

		for (int i = 0; i < combo.getCount(); i++) {
			Medicamento medicamento = (Medicamento) combo.getItemAtPosition(i);

			if (medicamento.getId().equals(idMedicamento)) {
				combo.setSelection(i);
				break;
			}
		}

	}

	/** Devuelve si el medicamento seleccionado es Insulina **/
	Boolean esInsulina(Spinner combo) {
		Medicamento medicamento = (Medicamento) (combo.getSelectedItem());

		if (ActivityMain.TIPO_INSULINA.equals(medicamento.getTipo())) { // el "tipo de de medicamento" tiene _id como
																		// alias
			return true;
		} else {
			return false;
		}
	}

	/** Carga la Fecha actual y grisa el campo **/
	void cargarBtnFecha(Long fecha) {
		int intDia, intMes, intAno;

		if (fecha == null) {
			// Agregamos la fecha actual y llamamos al DatePicketDialog
			intDia = objCalendario.get(Calendar.DAY_OF_MONTH);
			intMes = objCalendario.get(Calendar.MONTH) + 1;
			intAno = objCalendario.get(Calendar.YEAR);

			btnFecha.setText(new StringBuilder().append(intDia).append("/").append(intMes).append("/").append(intAno)
					.append(" "));
		} else {
			btnFecha.setText(ActivityMain.DATE_FORMAT.format(new Date(fecha)));
			btnFecha.setEnabled(false);
		}
	}

	/** Carga la Hora actual y grisa el campo **/
	void cargarBtnHora(Long hora) {
		int intHora, intMinuto;

		if (hora == null) {
			// Agregamos la fecha actual y llamamos al DatePicketDialog
			final Calendar objCalendario = Calendar.getInstance();
			intHora = objCalendario.get(Calendar.HOUR_OF_DAY);
			intMinuto = objCalendario.get(Calendar.MINUTE);

			CharSequence strHora = "", strMinuto = "";			
			if (intHora < 10) {
				strHora = new StringBuilder().append(0).append(intHora);
			} else {
				strHora = new StringBuilder().append(intHora);
			}

			if (intMinuto < 10) {
				strMinuto = new StringBuilder().append(0).append(intMinuto);
			} else {
				strMinuto = new StringBuilder().append(intMinuto);
			}
			
			btnHora.setText(new StringBuilder().append(strHora).append(":").append(strMinuto));			
		} else {
			btnHora.setText(ActivityMain.TIME_FORMAT.format(new Date(hora)));
			btnHora.setEnabled(false);
		}

	}

	/** Se llama al hacer click en "Guardar" */
	public void sendMsgMedicamentoNuevaBtnGuardar(View view) {
		String strAplicacion = null;

		Medicamento medicamento = (Medicamento) (spinnerMedicamentos.getSelectedItem());
		if (medicamento != null) {
			// Solo cargamos la aplicacion si es Insulina
			if (ActivityMain.TIPO_INSULINA.equals(medicamento.getTipo())) {
				strAplicacion = spinnerAplicacion.getSelectedItem().toString();
			} else {
				strAplicacion = null;
			}
		}
		Medicacion medicacion = (Medicacion) intentMedicamentoNueva
				.getSerializableExtra(ActivityListaRegistrosMedicacion.INTENT_VALUE_MEDICACION);

		medicacion.setAlias(objPerfilUsuario.getId());
		medicacion.setDosis(spinnerDosis.getSelectedItem().toString());
		medicacion.setUmDosis("UN");
		medicacion.setLugarAplicacion(strAplicacion);
		medicacion.setMedicamento(medicamento);

		String strDia = (String) btnFecha.getText();
		String strHora = (String) btnHora.getText();

		Date dia;
		Date hora;
		try {
			dia = ActivityMain.DATE_FORMAT.parse(strDia);
			hora = ActivityMain.TIME_FORMAT.parse(strHora);
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(hora);
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int minutes = calendar.get(Calendar.MINUTE);

		calendar.setTime(dia);
		calendar.set(Calendar.HOUR, hour);
		calendar.set(Calendar.MINUTE, minutes);
		
		medicacion.setFecha(calendar.getTimeInMillis());

		// btnFecha.getText()medicacion.toString().split(regularExpression);

		MedicacionDaoImpl.getInstance(this).save(medicacion);

		// Salimos
		Toast.makeText(this, "Medicacion Guardada", Toast.LENGTH_SHORT).show();
		this.finish();
	}

	/** Se llama al hacer click en "Cancelar" */
	public void sendMsgMedicamentoNuevaBtnCancelar(View view) {
		Toast.makeText(this, "Operacion Cancelada", Toast.LENGTH_SHORT).show();
		this.finish();
	}

	/** Se llama al hacer click en el Boton "Hora" */
	public void ClickHora(View v) {
		LayoutInflater inf = LayoutInflater.from(this);

		// Layout que contiene los wheel's
		View view = inf.inflate(R.layout.wheeltime, null);

		// Hora wheel
		final WheelView hours = (WheelView) view.findViewById(R.id.hours);
		hours.setViewAdapter(new NumericWheelAdapter(this, 0, 23));
		hours.setCyclic(true);
		hours.setCurrentItem(objCalendario.get(Calendar.HOUR_OF_DAY));

		// Minutos wheel
		final WheelView mins = (WheelView) view.findViewById(R.id.minutes);
		mins.setViewAdapter(new NumericWheelAdapter(this, 0, 59));
		mins.setCyclic(true);
		mins.setCurrentItem(objCalendario.get(Calendar.MINUTE));

		// Dialogo
		new AlertDialog.Builder(this).setMessage(R.string.titulo_dialogo_hora).setView(view)
				.setPositiveButton(R.string.btn_fijar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						CharSequence strHora = "", strMinuto = "";
						
						int hora = hours.getCurrentItem();
						if (hora < 10) {
							strHora = new StringBuilder().append(0).append(hora);
						} else {
							strHora = new StringBuilder().append(hora);
						}
						
						int minuto = mins.getCurrentItem();
						if (minuto < 10) {
							strMinuto = new StringBuilder().append(0).append(minuto);
						} else {
							strMinuto = new StringBuilder().append(minuto);
						}
						btnHora.setText(new StringBuilder().append(strHora).append(":").append(strMinuto));
					}
				})

				.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						return;
					}
				}).create().show();

	}

	
	/** Se llama al hacer click en el Boton "Fecha" */
	public void ClickFecha(View v) {
		LayoutInflater inf = LayoutInflater.from(this);
		Resources res = getResources();
		
		// layout of alert box contains
		View view = inf.inflate(R.layout.wheeldate, null);

		final WheelView month = (WheelView) view.findViewById(R.id.month);
		final WheelView year = (WheelView) view.findViewById(R.id.year);
		final WheelView day = (WheelView) view.findViewById(R.id.day);

		OnWheelChangedListener listener = new OnWheelChangedListener() {
			public void onChanged(WheelView wheel, int oldValue, int newValue) {
				updateDays(year, month, day);
			}
		};

		// month
		int curMonth = objCalendario.get(Calendar.MONTH);
		String months[] = res.getStringArray(R.array.lb_meses);
		month.setViewAdapter(new DateArrayAdapter(this, months, curMonth));
		// month.setCyclic(true);
		month.setCurrentItem(curMonth);
		month.addChangingListener(listener);

		// year
		final int curYear = objCalendario.get(Calendar.YEAR);
		WheelViewAdapter adapter;
		adapter = new DateNumericAdapter(this, curYear - 3, curYear + 10, 3);
		year.setViewAdapter(adapter);
		// year.setCyclic(true);
		year.setCurrentItem(3);
		year.addChangingListener(listener);

		// //day
		updateDays(year, month, day);
		// day.setCyclic(true);
		day.setCurrentItem(objCalendario.get(Calendar.DAY_OF_MONTH) - 1);

		new AlertDialog.Builder(this).setMessage(R.string.titulo_dialogo_fecha).setView(view)
				.setPositiveButton(R.string.btn_fijar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						// write code of lines, whatever want to with
						// value of this timepicker
						int dia = day.getCurrentItem() + 1;
						int mes = month.getCurrentItem() + 1;
						int ano = (curYear - 3) + year.getCurrentItem();

						btnFecha.setText(new StringBuilder().append(dia).append("/").append(mes).append("/")
								.append(ano).append(" "));
					}
				})

				.setNegativeButton(R.string.btn_cancelar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						return;
					}
				}).create().show();

	}

	/**
	 * Updates day wheel. Sets max days according to selected month and year
	 */
	void updateDays(WheelView year, WheelView month, WheelView day) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + year.getCurrentItem());
		calendar.set(Calendar.MONTH, month.getCurrentItem());

		int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		day.setViewAdapter(new DateNumericAdapter(this, 1, maxDays, calendar.get(Calendar.DAY_OF_MONTH) - 1));
		int curDay = Math.min(maxDays, day.getCurrentItem() + 1);
		day.setCurrentItem(curDay - 1, true);
	}

}
